for (list = animated->animations; list; list = list->next)
{
- if (!_gtk_style_animation_is_static (list->data, animated->current_time))
+ if (!_gtk_style_animation_is_static (list->data))
return FALSE;
}
{
animation = gtk_css_animated_style_find_transition (GTK_CSS_ANIMATED_STYLE (source), i);
if (animation)
- animations = g_slist_prepend (animations, g_object_ref (animation));
+ {
+ animation = _gtk_style_animation_advance (animation, timestamp);
+ animations = g_slist_prepend (animations, animation);
+ }
continue;
}
if (animation)
{
- animation = _gtk_css_animation_copy (GTK_CSS_ANIMATION (animation),
- _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)));
+ animation = _gtk_css_animation_advance_with_play_state (GTK_CSS_ANIMATION (animation),
+ timestamp,
+ _gtk_css_play_state_value_get (_gtk_css_array_value_get_nth (play_states, i)));
}
else
{
/* PUBLIC API */
static void
-gtk_css_animated_style_apply_animations (GtkCssAnimatedStyle *style,
- gint64 timestamp)
+gtk_css_animated_style_apply_animations (GtkCssAnimatedStyle *style)
{
GSList *l;
{
GtkStyleAnimation *animation = l->data;
- _gtk_style_animation_set_values (animation,
- timestamp,
- GTK_CSS_ANIMATED_STYLE (style));
+ _gtk_style_animation_apply_values (animation,
+ GTK_CSS_ANIMATED_STYLE (style));
}
}
result->current_time = timestamp;
result->animations = animations;
- gtk_css_animated_style_apply_animations (result, timestamp);
+ gtk_css_animated_style_apply_animations (result);
return GTK_CSS_STYLE (result);
}
{
GtkStyleAnimation *animation = l->data;
- if (_gtk_style_animation_is_finished (animation, timestamp))
+ if (_gtk_style_animation_is_finished (animation))
continue;
- animations = g_slist_prepend (animations, g_object_ref (animation));
+ animation = _gtk_style_animation_advance (animation, timestamp);
+ animations = g_slist_prepend (animations, animation);
}
animations = g_slist_reverse (animations);
result->current_time = timestamp;
result->animations = animations;
- gtk_css_animated_style_apply_animations (result, timestamp);
+ gtk_css_animated_style_apply_animations (result);
return GTK_CSS_STYLE (result);
}
return gtk_progress_tracker_get_progress (&animation->tracker, reverse);
}
+GtkStyleAnimation *
+gtk_css_animation_advance (GtkStyleAnimation *style_animation,
+ gint64 timestamp)
+{
+ GtkCssAnimation *animation = GTK_CSS_ANIMATION (style_animation);
+
+ return _gtk_css_animation_advance_with_play_state (animation,
+ timestamp,
+ animation->play_state);
+}
+
static void
-gtk_css_animation_set_values (GtkStyleAnimation *style_animation,
- gint64 for_time_us,
- GtkCssAnimatedStyle *style)
+gtk_css_animation_apply_values (GtkStyleAnimation *style_animation,
+ GtkCssAnimatedStyle *style)
{
GtkCssAnimation *animation = GTK_CSS_ANIMATION (style_animation);
double progress;
guint i;
- if (animation->play_state != GTK_CSS_PLAY_STATE_PAUSED)
- gtk_progress_tracker_advance_frame (&animation->tracker, for_time_us);
- else
- gtk_progress_tracker_skip_frame (&animation->tracker, for_time_us);
-
if (!gtk_css_animation_is_executing (animation))
return;
}
static gboolean
-gtk_css_animation_is_finished (GtkStyleAnimation *style_animation,
- gint64 at_time_us)
+gtk_css_animation_is_finished (GtkStyleAnimation *style_animation)
{
return FALSE;
}
static gboolean
-gtk_css_animation_is_static (GtkStyleAnimation *style_animation,
- gint64 at_time_us)
+gtk_css_animation_is_static (GtkStyleAnimation *style_animation)
{
GtkCssAnimation *animation = GTK_CSS_ANIMATION (style_animation);
object_class->finalize = gtk_css_animation_finalize;
- animation_class->set_values = gtk_css_animation_set_values;
+ animation_class->advance = gtk_css_animation_advance;
+ animation_class->apply_values = gtk_css_animation_apply_values;
animation_class->is_finished = gtk_css_animation_is_finished;
animation_class->is_static = gtk_css_animation_is_static;
}
}
GtkStyleAnimation *
-_gtk_css_animation_copy (GtkCssAnimation *source,
- GtkCssPlayState play_state)
+_gtk_css_animation_advance_with_play_state (GtkCssAnimation *source,
+ gint64 timestamp,
+ GtkCssPlayState play_state)
{
GtkCssAnimation *animation;
g_return_val_if_fail (GTK_IS_CSS_ANIMATION (source), NULL);
- if (source->play_state == play_state)
- return g_object_ref (source);
-
animation = g_object_new (GTK_TYPE_CSS_ANIMATION, NULL);
animation->name = g_strdup (source->name);
animation->play_state = play_state;
animation->fill_mode = source->fill_mode;
- memcpy (&animation->tracker, &source->tracker, sizeof (source->tracker));
+ gtk_progress_tracker_init_copy (&source->tracker, &animation->tracker);
+ if (animation->play_state == GTK_CSS_PLAY_STATE_PAUSED)
+ gtk_progress_tracker_skip_frame (&animation->tracker, timestamp);
+ else
+ gtk_progress_tracker_advance_frame (&animation->tracker, timestamp);
return GTK_STYLE_ANIMATION (animation);
}
-
GtkCssFillMode fill_mode,
double iteration_count);
-GtkStyleAnimation * _gtk_css_animation_copy (GtkCssAnimation *animation,
- GtkCssPlayState play_state);
+GtkStyleAnimation * _gtk_css_animation_advance_with_play_state (GtkCssAnimation *animation,
+ gint64 timestamp,
+ GtkCssPlayState play_state);
const char * _gtk_css_animation_get_name (GtkCssAnimation *animation);
G_DEFINE_TYPE (GtkCssTransition, _gtk_css_transition, GTK_TYPE_STYLE_ANIMATION)
+static GtkStyleAnimation *
+gtk_css_transition_advance (GtkStyleAnimation *style_animation,
+ gint64 timestamp)
+{
+ GtkCssTransition *source = GTK_CSS_TRANSITION (style_animation);
+
+ GtkCssTransition *transition;
+
+ transition = g_object_new (GTK_TYPE_CSS_TRANSITION, NULL);
+
+ transition->property = source->property;
+ transition->start = _gtk_css_value_ref (source->start);
+ transition->ease = _gtk_css_value_ref (source->ease);
+
+ gtk_progress_tracker_init_copy (&source->tracker, &transition->tracker);
+ gtk_progress_tracker_advance_frame (&transition->tracker, timestamp);
+
+ return GTK_STYLE_ANIMATION (transition);
+}
+
static void
-gtk_css_transition_set_values (GtkStyleAnimation *animation,
- gint64 for_time_us,
- GtkCssAnimatedStyle *style)
+gtk_css_transition_apply_values (GtkStyleAnimation *style_animation,
+ GtkCssAnimatedStyle *style)
{
- GtkCssTransition *transition = GTK_CSS_TRANSITION (animation);
+ GtkCssTransition *transition = GTK_CSS_TRANSITION (style_animation);
GtkCssValue *value, *end;
double progress;
GtkProgressState state;
end = gtk_css_animated_style_get_intrinsic_value (style, transition->property);
- gtk_progress_tracker_advance_frame (&transition->tracker, for_time_us);
state = gtk_progress_tracker_get_state (&transition->tracker);
if (state == GTK_PROGRESS_STATE_BEFORE)
}
static gboolean
-gtk_css_transition_is_finished (GtkStyleAnimation *animation,
- gint64 at_time_us)
+gtk_css_transition_is_finished (GtkStyleAnimation *animation)
{
GtkCssTransition *transition = GTK_CSS_TRANSITION (animation);
}
static gboolean
-gtk_css_transition_is_static (GtkStyleAnimation *animation,
- gint64 at_time_us)
+gtk_css_transition_is_static (GtkStyleAnimation *animation)
{
GtkCssTransition *transition = GTK_CSS_TRANSITION (animation);
object_class->finalize = gtk_css_transition_finalize;
- animation_class->set_values = gtk_css_transition_set_values;
+ animation_class->advance = gtk_css_transition_advance;
+ animation_class->apply_values = gtk_css_transition_apply_values;
animation_class->is_finished = gtk_css_transition_is_finished;
animation_class->is_static = gtk_css_transition_is_static;
}
G_DEFINE_ABSTRACT_TYPE (GtkStyleAnimation, _gtk_style_animation, G_TYPE_OBJECT)
+static GtkStyleAnimation *
+gtk_style_animation_real_advance (GtkStyleAnimation *animation,
+ gint64 timestamp)
+{
+ return NULL;
+}
+
static void
-gtk_style_animation_real_set_values (GtkStyleAnimation *animation,
- gint64 for_time_us,
- GtkCssAnimatedStyle *style)
+gtk_style_animation_real_apply_values (GtkStyleAnimation *animation,
+ GtkCssAnimatedStyle *style)
{
}
static gboolean
-gtk_style_animation_real_is_finished (GtkStyleAnimation *animation,
- gint64 at_time_us)
+gtk_style_animation_real_is_finished (GtkStyleAnimation *animation)
{
return TRUE;
}
static gboolean
-gtk_style_animation_real_is_static (GtkStyleAnimation *animation,
- gint64 at_time_us)
+gtk_style_animation_real_is_static (GtkStyleAnimation *animation)
{
return FALSE;
}
static void
_gtk_style_animation_class_init (GtkStyleAnimationClass *klass)
{
- klass->set_values = gtk_style_animation_real_set_values;
+ klass->advance = gtk_style_animation_real_advance;
+ klass->apply_values = gtk_style_animation_real_apply_values;
klass->is_finished = gtk_style_animation_real_is_finished;
klass->is_static = gtk_style_animation_real_is_static;
}
{
}
+GtkStyleAnimation *
+_gtk_style_animation_advance (GtkStyleAnimation *animation,
+ gint64 timestamp)
+{
+ GtkStyleAnimationClass *klass;
+
+ g_return_val_if_fail (GTK_IS_STYLE_ANIMATION (animation), NULL);
+
+ klass = GTK_STYLE_ANIMATION_GET_CLASS (animation);
+
+ return klass->advance (animation, timestamp);
+}
+
void
-_gtk_style_animation_set_values (GtkStyleAnimation *animation,
- gint64 for_time_us,
- GtkCssAnimatedStyle *style)
+_gtk_style_animation_apply_values (GtkStyleAnimation *animation,
+ GtkCssAnimatedStyle *style)
{
GtkStyleAnimationClass *klass;
klass = GTK_STYLE_ANIMATION_GET_CLASS (animation);
- klass->set_values (animation, for_time_us, style);
+ klass->apply_values (animation, style);
}
gboolean
-_gtk_style_animation_is_finished (GtkStyleAnimation *animation,
- gint64 at_time_us)
+_gtk_style_animation_is_finished (GtkStyleAnimation *animation)
{
GtkStyleAnimationClass *klass;
klass = GTK_STYLE_ANIMATION_GET_CLASS (animation);
- return klass->is_finished (animation, at_time_us);
+ return klass->is_finished (animation);
}
/**
* Returns: %TRUE if @animation will not change anymore after @at_time_us
**/
gboolean
-_gtk_style_animation_is_static (GtkStyleAnimation *animation,
- gint64 at_time_us)
+_gtk_style_animation_is_static (GtkStyleAnimation *animation)
{
GtkStyleAnimationClass *klass;
klass = GTK_STYLE_ANIMATION_GET_CLASS (animation);
- return klass->is_static (animation, at_time_us);
+ return klass->is_static (animation);
}
{
GObjectClass parent_class;
- gboolean (* is_finished) (GtkStyleAnimation *animation,
- gint64 at_time_us);
- gboolean (* is_static) (GtkStyleAnimation *animation,
- gint64 at_time_us);
- void (* set_values) (GtkStyleAnimation *animation,
- gint64 for_time_us,
+ gboolean (* is_finished) (GtkStyleAnimation *animation);
+ gboolean (* is_static) (GtkStyleAnimation *animation);
+ void (* apply_values) (GtkStyleAnimation *animation,
GtkCssAnimatedStyle *style);
+ GtkStyleAnimation * (* advance) (GtkStyleAnimation *animation,
+ gint64 timestamp);
};
GType _gtk_style_animation_get_type (void) G_GNUC_CONST;
-void _gtk_style_animation_set_values (GtkStyleAnimation *animation,
- gint64 for_time_us,
+GtkStyleAnimation * _gtk_style_animation_advance (GtkStyleAnimation *animation,
+ gint64 timestamp);
+void _gtk_style_animation_apply_values (GtkStyleAnimation *animation,
GtkCssAnimatedStyle *style);
-gboolean _gtk_style_animation_is_finished (GtkStyleAnimation *animation,
- gint64 at_time_us);
-gboolean _gtk_style_animation_is_static (GtkStyleAnimation *animation,
- gint64 at_time_us);
+gboolean _gtk_style_animation_is_finished (GtkStyleAnimation *animation);
+gboolean _gtk_style_animation_is_static (GtkStyleAnimation *animation);
G_END_DECLS